#ifndef __PID_H__
#define __PID_H__



typedef struct s_sensor{
	
	double factorDen;	//Denominador
	double factorNum;	//Numerador
	double delta;		//offset
	unsigned int * sensorData;	//ptr a la variable que contiene los datos leidos o establecidos.
	
}s_sensor; 	

typedef struct s_pid
{
	
	double out_pas;      	    // Valor pasado de la salida 
 	double error_acum;      	// Acumulacin del error
 	double int_max, int_min;  // Valor mximo y mnimo del integrado (para evitar windup)
	double kp,ki,kd;   	        
  
 	double * tolerance;	//Tolerancia admitida en este controlador
  
 	s_sensor * s;			//Medicion del sensor	
 	s_sensor * r;			//Referencia
 	
}s_pid;


/*! \brief Inicializar un controlador PID 

Esta funcion inicializa un controlador PID teniendo en cuenta sus caracteristicas. El desarrollador debe haber declarado previamente dos estructuras tipo sensor : una para el sensor de verda y otra para establecer la referencia.

\param pid Apuntador a una estructura s_pid, la cual va a contener la informacion del controlador.
\param kpp Constante de proporcionalidad kp del PID.
\param kii Constante de integracion ki del PID.
\param kdd Constante derivativa kd del PID.
\param int_maxx Maximo valor de referencia.
\param int_minn Minimo valor de referencia.
\param s Apuntador a una estructura tipo s_sensor que contiene los datos del sensor en todo momento.
\param r Apuntador a una estructura tipo s_sensor que contiene los datos de referencia (set point) en todo momento.
\param tolerance Apuntador a una variable tipo double, que contiene el valor de tolerancia del error para este controlador. Si el valor de este puntero es 0x0, no habra tolerancia al error 	

*/
void vPidInit(s_pid *pid, double kpp, double kii, double kdd, double int_maxx, double int_minn, s_sensor * s, s_sensor * r, double * tolerance);

/*! \brief Inicializar un sensor  o una referencia.

Esta funcion inicializa un bloque de control para evaluar o leer los resultados de los sensores o de las referencia (set points) que desee conlocarse en un controlador. Es necesario inicializar un par de estructuras de este tipo para poder inicializar un controla PID.

\param s Apuntador a una estructura tipo s_sensor, la cual va acontener la informacion acerca del sensor y/o punto de referencia (set point).
\param sPtr Apuntador a un flotante. Ese flotante representa la medicion de un sensor o una referencia cargada por el usuario.
\param factorDet Valor de normalizacion. Si la variable a sensar o el punto de referencia establecido no se van a normalizar este valor debe ser 1. Si se piensa normalizar esta variable entonces se debe pensar en este valor como el Denominador del factor que la multiplica.
\param factorNum Valor de normalizacion. Si la variable a sensar o el punto de referencia establecido no se van a normalizar este valor debe ser 1. Si se piensa normalizar esta variable, entonces se debe pensar en este valor como el Numerador del factor que la multiplica. 
\param delta valor de offset que se suma a la variable antes de la normalizacion. Si no se piensa normalizar este offset debe tener un valor de 0.   

*/
void vPidSensorInit (s_sensor * s, float * sPtr, double factorDet, double factorNum, double delta); 

/*! \brief Ejecuta el controlador.

Esta funcion ejecuta el controlador PID p. La funcion entonces calcula la accion de control mas adecuada. 

\param p Apuntador a la estructura de control del controlador PID.

\return La funcion retorna una accion de control. El valor de retorno esta expresado en termino de numero de pulsos.


*/

double dPidControlActions(s_pid *p);
#endif /* __PID_H__*/





